지속가능발전목표(SDG): 데이터 분석

SDG 소개

한국의 SDG 데이터 플랫폼
https://kostat-sdg-kor.github.io/sdg-indicators/goals/

  • 인류의 보편적인 발전을 위해 전 세계 모든 국가가 2030년까지 달성하기로 합의한 변혁적인 목표
  • 2015년 제70차 UN 총회에서 회원국 만장일치로 「세계의 변혁: 지속가능발전을 위한 2030 의제(Transforming Our World: The 2030 Agenda for Sustainable Development)」를 채택
  • 사람, 지구, 번영, 평화, 파트너십에 기반한 17개의 목표와 169개 세부목표

SDG에 대해 얼마나 잘 알고 있나요?

SD misconception study (gapminder.org)
https://upgrader.gapminder.org/t/2020-sustainable-development-misconception-study

18 questions related to UN Sustainable Development Goals (SDGs)

2015년 이후 얼마나 진척되었는가?

2020년 UN SDG 미팅에서 Gapminder의 발표 영상
https://youtu.be/v7WUpgPZzpI.

SDGS are all related and when we think of one thing at a time we get an illusion of conflict between different goals.

Children in poverty can’t do their homework if they don’t have electricity. It’s all related and when we think of one thing at a time we get an illusion of conflict between different goals

SDG 데이터 분석에 앞서 가설 설정하기

  • 산업화에 따른 경제, 교육, 건강 수준의 발전은 지속가능한 형태로 이루어지고 있는가?
  • 환경 문제
  • 예) 플라스틱 폐기량과 인간개발지수(human development index; 경제, 교육, 건강 수준의 통합 지표)의 관계

R의 기초

  • R & RStudio
  • 자료형, 자료구조
  • 함수, 반복문, 조건문
  • 패키지

작업 디렉토리 설정하기

setwd("~/Dropbox/Github/sdg")

데이터 다운로드

https://www.gapminder.org/data/
Choose individual indicators
- Environment > Plastic percent of waste composition
- Society > Human development index

또는,
https://github.com/yoonhohong/sdg/data

데이터 불러오기

폐기물 중 플라스틱 비율

plastic = read.csv("data/compt_plastic_wst.csv")
head(plastic)

데이터 불러오기

폐기물 중 플라스틱 비율

plastic = read.csv("data/compt_plastic_wst.csv")
head(plastic)
    country X1993 X1995 X1998 X2000 X2002 X2003 X2004 X2005 X2006 X2007 X2008
1    Angola    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA  13.5
2   Albania    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
3   Andorra    NA    NA    NA    NA    NA    NA    NA  11.3    NA    NA    NA
4       UAE    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
5 Argentina    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
6   Armenia    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
  X2009 X2010 X2011 X2012 X2013 X2014 X2015 X2016 X2017
1    NA    NA    NA    NA    NA    NA    NA    NA    NA
2    NA    NA    NA    NA    NA    NA   9.6    NA    NA
3    NA    NA    NA    NA    NA    NA    NA    NA    NA
4    NA    NA    19    NA    NA    NA    NA    NA    NA
5    NA    NA    NA    NA    NA    NA  14.6    NA    NA
6    NA    NA    NA    NA    NA    NA  11.4    NA    NA

데이터프레임 구조 변경하기

wide 포맷 -> long 포맷

library(tidyr)
temp = gather(plastic, key = "year", value = "plastic", X1993:X2017)
head(temp)

데이터프레임 구조 변경하기

wide 포맷 -> long 포맷

library(tidyr)
temp = gather(plastic, key = "year", value = "plastic", X1993:X2017)
head(temp)
    country  year plastic
1    Angola X1993      NA
2   Albania X1993      NA
3   Andorra X1993      NA
4       UAE X1993      NA
5 Argentina X1993      NA
6   Armenia X1993      NA

년도 앞에 있는 “X” 문자를 떼어내기

library(stringr)
temp$year = str_remove(temp$year, "^X")
head(temp)

년도 앞에 있는 “X” 문자를 떼어내기

library(stringr)
temp$year = str_remove(temp$year, "^X")
head(temp)
    country year plastic
1    Angola 1993      NA
2   Albania 1993      NA
3   Andorra 1993      NA
4       UAE 1993      NA
5 Argentina 1993      NA
6   Armenia 1993      NA

년도를 수치 자료형으로 변경하기

temp$year = as.numeric(temp$year) 
plastic <- temp 

데이터 시각화하기: 산점도

library(ggplot2)
ggplot(plastic, aes(x = year, y = plastic)) + 
  geom_point()

데이터 시각화하기: 산점도

library(ggplot2)
ggplot(plastic, aes(x = year, y = plastic)) + 
  geom_point()

데이터 불러오기

인간개발지수(human development index)

hdi = read.csv("data/hdi_human_development_index.csv") 
head(hdi)

데이터 불러오기

인간개발지수(human development index)

hdi = read.csv("data/hdi_human_development_index.csv") 
head(hdi)
      country X1990 X1991 X1992 X1993 X1994 X1995 X1996 X1997 X1998 X1999 X2000
1 Afghanistan 0.273 0.279 0.287 0.297 0.292 0.310 0.319 0.323 0.324 0.332 0.335
2      Angola    NA    NA    NA    NA    NA    NA    NA    NA    NA 0.364 0.375
3     Albania 0.647 0.629 0.614 0.617 0.624 0.634 0.645 0.642 0.657 0.669 0.677
4     Andorra    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA 0.818
5         UAE 0.728 0.739 0.742 0.748 0.755 0.762 0.767 0.773 0.779 0.787 0.796
6   Argentina 0.723 0.730 0.735 0.739 0.744 0.745 0.751 0.756 0.762 0.773 0.779
  X2001 X2002 X2003 X2004 X2005 X2006 X2007 X2008 X2009 X2010 X2011 X2012 X2013
1 0.337 0.362 0.376 0.392 0.400 0.409 0.424 0.430 0.440 0.448 0.456 0.466 0.474
2 0.386 0.403 0.420 0.433 0.447 0.459 0.475 0.486 0.500 0.510 0.526 0.541 0.552
3 0.684 0.689 0.696 0.700 0.711 0.718 0.730 0.736 0.741 0.754 0.766 0.778 0.785
4 0.825 0.832 0.841 0.833 0.833 0.848 0.847 0.850 0.848 0.848 0.849 0.869 0.864
5 0.800 0.804 0.814 0.818 0.822 0.827 0.831 0.834 0.833 0.835 0.840 0.846 0.852
6 0.784 0.785 0.793 0.798 0.802 0.814 0.817 0.825 0.827 0.834 0.841 0.843 0.845
  X2014 X2015 X2016 X2017 X2018 X2019 X2020 X2021
1 0.479 0.478 0.481 0.482 0.483 0.488 0.483 0.478
2 0.563 0.582 0.596 0.597 0.595 0.595 0.590 0.586
3 0.792 0.795 0.798 0.802 0.806 0.810 0.794 0.796
4 0.871 0.867 0.871 0.868 0.872 0.873 0.848 0.858
5 0.859 0.865 0.870 0.897 0.909 0.920 0.912 0.911
6 0.846 0.848 0.847 0.851 0.850 0.852 0.840 0.842

데이터 전처리

  • 데이터프레임 구조 변경하기: wide 포맷 -> long 포맷
  • 년도 앞에 “X”자 떼어내기
  • 년도를 수치 자료형으로 변환하기
temp = gather(hdi, key = "year", value = "hdindex", X1990:X2021)
temp$year = str_remove(temp$year, "^X")
temp$year = as.numeric(temp$year) 
hdi <- temp 

데이터 병합하기

library(dplyr)
plastic_hdi = plastic %>%
  inner_join(hdi, by = c("country", "year")) 
head(plastic_hdi)

데이터 병합하기

library(dplyr)
plastic_hdi = plastic %>%
  inner_join(hdi, by = c("country", "year")) 
head(plastic_hdi)
    country year plastic hdindex
1    Angola 1993      NA      NA
2   Albania 1993      NA   0.617
3   Andorra 1993      NA      NA
4       UAE 1993      NA   0.748
5 Argentina 1993      NA   0.739
6   Armenia 1993      NA   0.616

결측치를 포함한 관측치는 제외시키기

ph = plastic_hdi[complete.cases(plastic_hdi),]
head(ph)

결측치를 포함한 관측치는 제외시키기

ph = plastic_hdi[complete.cases(plastic_hdi),]
head(ph)
        country year plastic hdindex
143      Turkey 1993     3.0   0.617
252        Mali 1995     2.0   0.270
387       Kenya 1998    18.7   0.479
637       Benin 2002     7.3   0.436
651 Switzerland 2002    15.0   0.890
662    Dominica 2002    16.0   0.695

인간개발지수와 플라스틱 폐기율의 관계: 산점도.

ggplot(ph, aes(x = hdindex, y=plastic)) + 
  geom_point()

인간개발지수와 플라스틱 폐기율의 관계: 산점도.

ggplot(ph, aes(x = hdindex, y=plastic)) + 
  geom_point()

중간 정리

  • 예상대로 생활수준이 높은 나라일수록 폐기물 중 플라스틱 비율이 높은 경향이 있다.
  • 그런데, 생활수준이 높은 나라들 가운데 플라스틱 페기률에 편차가 크다. 이유가 뭘까?
  • 혹시… 부의 불평등, 성 불평등이 관련이 있지 않을까?
  • 불평등 지표: 지니 지수(Gini index), 여성 국회의원 비율

가설

생활수준이 높은 나라에서 폐기물중 플라스틱 비율이 여성 국회의원 비율(남녀 정치적 평등) 혹은 Gini index (경제적 불평등)와 관련이 있지 않을까?

데이터 불러오기 & 전처리

  • 여성 국회의원 비율 데이터(Society > Governance > Percentage of women in national parliaments)
  • 데이터 구조 변경(wide -> long)
  • 자료형 변경(년도를 수치형으로)
  • 기존 데이터와 병합, 결측 관측치 제외

데이터 불러오기 & 전처리

wn = read.csv("data/wn_bothhouses_c.csv")
temp = gather(wn, key = "year", value = "wnparl", X1945:X2021)
temp$year = str_remove(temp$year, "^X")
temp$year = as.numeric(temp$year) 
phw = ph %>%
  inner_join(temp, by = c("country", "year"))
phw = phw[complete.cases(phw),]

시각화: 산점도

# hindex와 plastic 관계에 대한 산점도에서 여성 국회의원 비율을 점의 크기로 표현     
ggplot(phw, aes(x = hdindex, y=plastic, size = wnparl)) + 
  geom_point(alpha = 0.5) + 
  scale_size_continuous() 

시각화: 산점도

# hindex와 plastic 관계에 대한 산점도에서 여성 국회의원 비율을 점의 크기로 표현    
ggplot(phw, aes(x = hdindex, y=plastic, size = wnparl)) + 
  geom_point(alpha = 0.5) + 
  scale_size_continuous() 

시각화: 산점도

# hindex와 plastic 관계에 대한 산점도에서 여성 국회의원 비율을 점의 크기로 표현    
ggplot(phw, aes(x = hdindex, y=plastic, size = wnparl)) + 
  geom_point(alpha = 0.5) + 
  scale_size_continuous() 

시각화: 산점도

# hindex와 plastic 관계에 대한 산점도에서 여성 국회의원 비율을 점의 크기로 표현    
ggplot(phw, aes(x = hdindex, y=plastic, size = wnparl)) + 
  geom_point(alpha = 0.5) + 
  scale_size_continuous() 

다시 중간 정리, 그리고 새로운 가설

  • 예상대로 생활수준이 높은 나라들에서 플라스틱 폐기률이 낮은 나라들은 높은 나라들에 비해 여성 국회의원 비율이 높아 보인다.
  • 반면, 생활수준이 높지 않은 나라들에서는 이러한 상관 관계가 뚜렷해 보이지 않는다.
  • 가설: 생활수준에 따라 두 부분으로 나누어 볼 때, 여성 국회의원의 비율과 플라스틱 폐기율간의 상관관계에는 차이가 있을 것이다.

새로운 변수 만들기: 생활수준에 따라 그룹 나누기

phwg = phw %>%
  mutate(hdi_gr = ifelse(hdindex < median(hdindex), "low", "high"))
head(phwg)

새로운 변수 만들기: 생활수준에 따라 그룹 나누기

phwg = phw %>%
  mutate(hdi_gr = ifelse(hdindex < median(hdindex), "low", "high"))
head(phwg)
      country year plastic hdindex wnparl hdi_gr
1      Turkey 1993     3.0   0.617   2.10    low
2        Mali 1995     2.0   0.270   8.58    low
3       Kenya 1998    18.7   0.479   3.88    low
4       Benin 2002     7.3   0.436   6.93    low
5 Switzerland 2002    15.0   0.890  24.10   high
6    Dominica 2002    16.0   0.695  16.50    low

부분(그룹)으로 나누어 시각화하기

ggplot(phwg, aes(x = wnparl, y=plastic)) + 
  geom_point() + 
  facet_wrap(~ hdi_gr)

부분(그룹)으로 나누어 시각화하기

ggplot(phwg, aes(x = wnparl, y=plastic)) + 
  geom_point() + 
  facet_wrap(~ hdi_gr)

통계적 추론: 추정과 검정

  • 둘 사이에 상관관계가 있는가?(양/음) 얼마나 큰가?
  • 둘 사이에 어떤 관련성이 있는가?
  • 추론의 불확실성은 얼마인가?

상관분석: 전체

cor.test(phwg$plastic, phwg$wnparl)

상관분석: 전체

cor.test(phwg$plastic, phwg$wnparl)

    Pearson's product-moment correlation

data:  phwg$plastic and phwg$wnparl
t = -1.7117, df = 131, p-value = 0.08932
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.31031803  0.02289913
sample estimates:
       cor 
-0.1479042 

상관분석: 부분

인간개발지수가 낮은 그룹

phwg_lo = phwg %>% filter(hdi_gr == "low")  
cor.test(phwg_lo$plastic, phwg_lo$wnparl)

상관분석: 부분

인간개발지수가 낮은 그룹

phwg_lo = phwg %>% filter(hdi_gr == "low")  
cor.test(phwg_lo$plastic, phwg_lo$wnparl)

    Pearson's product-moment correlation

data:  phwg_lo$plastic and phwg_lo$wnparl
t = -0.8086, df = 62, p-value = 0.4218
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.3394407  0.1473544
sample estimates:
      cor 
-0.102155 

상관분석: 부분

인간개발지수가 높은 그룹

phwg_hi = phwg %>% filter(hdi_gr == "high")  
cor.test(phwg_hi$plastic, phwg_hi$wnparl)

상관분석: 부분

인간개발지수가 높은 그룹

phwg_hi = phwg %>% filter(hdi_gr == "high")  
cor.test(phwg_hi$plastic, phwg_hi$wnparl)

    Pearson's product-moment correlation

data:  phwg_hi$plastic and phwg_hi$wnparl
t = -2.2689, df = 67, p-value = 0.0265
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.47384309 -0.03249335
sample estimates:
       cor 
-0.2671197 

선형회귀 분석: 전체

전체

lm_all = lm(plastic ~ wnparl, data = phwg)
summary(lm_all)

선형회귀 분석: 전체

전체

lm_all = lm(plastic ~ wnparl, data = phwg)
summary(lm_all)

Call:
lm(formula = plastic ~ wnparl, data = phwg)

Residuals:
     Min       1Q   Median       3Q      Max 
-10.7888  -3.5073  -0.0834   3.3550  19.4247 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 13.41612    0.97379  13.777   <2e-16 ***
wnparl      -0.07312    0.04272  -1.712   0.0893 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 5.474 on 131 degrees of freedom
Multiple R-squared:  0.02188,   Adjusted R-squared:  0.01441 
F-statistic:  2.93 on 1 and 131 DF,  p-value: 0.08932

선형회귀 분석: 부분

인간개발지수가 낮은 그룹

lm_lo = lm(plastic ~ wnparl, data = phwg_lo)
summary(lm_lo)

선형회귀 분석: 부분

인간개발지수가 낮은 그룹

lm_lo = lm(plastic ~ wnparl, data = phwg_lo)
summary(lm_lo)

Call:
lm(formula = plastic ~ wnparl, data = phwg_lo)

Residuals:
    Min      1Q  Median      3Q     Max 
-9.7325 -3.4292  0.0705  3.4047 14.0419 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 12.15812    1.21315  10.022 1.37e-14 ***
wnparl      -0.04960    0.06135  -0.809    0.422    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 5.313 on 62 degrees of freedom
Multiple R-squared:  0.01044,   Adjusted R-squared:  -0.005525 
F-statistic: 0.6538 on 1 and 62 DF,  p-value: 0.4218

선형회귀 분석: 부분

인간개발지수가 높은 그룹

lm_hi = lm(plastic ~ wnparl, data = phwg_hi)
summary(lm_hi)

선형회귀 분석: 부분

인간개발지수가 높은 그룹

lm_hi = lm(plastic ~ wnparl, data = phwg_hi)
summary(lm_hi)

Call:
lm(formula = plastic ~ wnparl, data = phwg_hi)

Residuals:
     Min       1Q   Median       3Q      Max 
-11.8250  -2.8542  -0.5082   3.6077  17.7996 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 15.85926    1.60706   9.868 1.09e-14 ***
wnparl      -0.14425    0.06358  -2.269   0.0265 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 5.519 on 67 degrees of freedom
Multiple R-squared:  0.07135,   Adjusted R-squared:  0.05749 
F-statistic: 5.148 on 1 and 67 DF,  p-value: 0.0265

산점도에 선형회귀식을 추가하기

인간개발지수가 높은 vs. 낮은 그룹: 여성 국회의원 비율 & 플라스틱 폐기률의 관련성에 대한 선형회귀식

ggplot(phwg, aes(x = wnparl, y=plastic)) + 
  geom_point() + 
  geom_smooth(method = "lm") + 
  facet_wrap(~ hdi_gr)

산점도에 선형회귀식을 추가하기

인간개발지수가 높은 vs. 낮은 그룹: 여성 국회의원 비율 & 플라스틱 폐기률의 관련성에 대한 선형회귀식

결론

  • UN 지속가능발전목표(SDG)에서 산업화에 따른 발전이 환경적 측면에서 지속가능한 형태로 이루어지고 있는지 문제 의식을 가짐

  • 인간개발지수가 높아짐에 따라 플라스틱 폐기량이 증가하고 있는 가운데, 산업화 수준이 높은 나라 중에 플라스틱 폐기량에 큰 편차가 있음을 발견

  • 인간개발지수가 높은 나라에서 여성 국회의원 비율과 플라스틱 폐기량의 관련성을 통계 분석으로 확인하고, 성평등이 산업화와 환경의 균형적 발전에 중요할 수 있음을 제안

R 데이터 분석 자료

R 프로그래밍 기초 3일만에 끝내기
https://youtube.com/playlist?list=PLaqQvlCBe8vL739pc-jESsucndheGmQIZ.

R for data science - 한국어
https://bookdown.org/sulgi/r4ds/